package com.hgl.bi.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hgl.bi.common.constant.BusinessConstant;
import com.hgl.bi.common.constant.ErrorCode;
import com.hgl.bi.common.manager.COSManager;
import com.hgl.bi.common.model.vo.R;
import com.hgl.bi.common.utils.AssertUtil;
import com.hgl.bi.common.utils.ConvertUtil;
import com.hgl.bi.common.utils.StrUtil;
import com.hgl.bi.web.entity.UserEntity;
import com.hgl.bi.web.model.dto.UserPageDTO;
import com.hgl.bi.web.model.dto.UserSaveDto;
import com.hgl.bi.web.model.dto.UserUpdateDto;
import com.hgl.bi.web.model.vo.UserInfoVo;
import com.hgl.bi.web.model.vo.UserVo;
import com.hgl.bi.web.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

/**
 * @program: BI
 * @description: 用户管理控制层
 * @author: hgl
 * @create: 2025-02-14 12:12
 */
@Tag(name = "用户管理模块")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private COSManager cosManager;

    /**
     * 获取所有用户
     * @return 用户列表
     * @author hgl
     */
    @Operation(summary = "查询所有用户", tags = "用户管理模块")
    @GetMapping("/user/list/all")
    public R<List<UserVo>> getAllUsers() {
        List<UserEntity> list = userService.list();
        List<UserVo> userVos = ConvertUtil.convertList(list, UserVo.class);
        return R.success(userVos);
    }

    /**
     * 统计用户数量
     *
     * @return 用户数量
     */
    @Operation(summary = "统计用户数量", tags = "用户管理模块")
    @GetMapping("/user/sum")
    public R<Long> countSumUsers() {
        long count = userService.count();
        return R.success(count);
    }

    /**
     * 统计本月新增用户
     * @return 本月新增用户
     * @author hgl
     */
    @Operation(summary = "统计本月新增用户", tags = "用户管理模块")
    @GetMapping("/user/new")
    public R<Long> countNewUsers() {
        // 获取当前日期
        LocalDate now = LocalDate.now();
        // 当前月份的第一天
        LocalDate startOfMonth = now.withDayOfMonth(1);
        // 当前月份的最后一天
        LocalDate endOfMonth = startOfMonth.plusMonths(1).minusDays(1);
        // 转换为 LocalDateTime
        LocalDateTime start = startOfMonth.atStartOfDay(); // 当月第一天 00:00:00
        LocalDateTime end = endOfMonth.atTime(LocalTime.MAX); // 当月最后一天 23:59:59
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<UserEntity>()
                .ge("register_time", start)
                .le("register_time", end);
        long count = userService.count(wrapper);
        return R.success(count);
    }

    /**
     * 统计活跃用户
     * @return 活用用户
     * @author hgl
     */
    @Operation(summary = "统计活跃用户", tags = "用户管理模块")
    @GetMapping("/user/active")
    public R<Long> countActiveUsers() {
        // 当前时间
        LocalDateTime now = LocalDateTime.now();
        // 前 7 天的起始时间
        LocalDateTime start = now.minusDays(7).withHour(0).withMinute(0).withSecond(0);
        // 当前时间的结束时间
        LocalDateTime end = now.withHour(23).withMinute(59).withSecond(59);
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<UserEntity>()
                .ge("last_login_time", start)
                .le("last_login_time", end);
        long count = userService.count(wrapper);
        return R.success(count);
    }

    /**
     * 统计异常用户
     * @return 异常用户
     * @author hgl
     */
    @Operation(summary = "统计异常用户", tags = "用户管理模块")
    @GetMapping("/user/exc")
    public R<Long> countExcUsers() {
        QueryWrapper<UserEntity> status = new QueryWrapper<UserEntity>()
                .eq("status", -1);
        long count = userService.count(status);
        return R.success(count);
    }

    /**
     * 分页查询用户列表
     *
     * @param pageDto 分页信息
     * @return 用户分页信息
     * @author hgl
     */
    @Operation(summary = "查询用户列表", tags = "用户管理模块")
    @GetMapping("/user/list")
    public R<Page<UserVo>> listUsers(@ParameterObject UserPageDTO pageDto) {
        // 非空校验
        AssertUtil.notNull(pageDto, ErrorCode.REQUEST_PARAM_ERROR);
        // 分页查询
        QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
        if (pageDto.getKeyword() != null && !pageDto.getKeyword().isEmpty()) wrapper
                .like("username", pageDto.getKeyword())
                .or().like("email", pageDto.getKeyword())
                .or().like("phone", pageDto.getKeyword());
        if (pageDto.getStatus() != null) wrapper
                .eq("status", pageDto.getStatus());
        if (pageDto.getRoleId() != null) wrapper
                .eq("role_id", pageDto.getRoleId());
        if (pageDto.getStartTime() != null && pageDto.getEndTime() != null) wrapper
                .ge("register_time", pageDto.getStartTime())
                .le("register_time", pageDto.getEndTime());
        Page<UserEntity> page = new Page<>(pageDto.getPage(), pageDto.getSize());

        Page<UserEntity> userPage = userService.page(page, wrapper);
        // 数据脱敏
        Page<UserVo> userVoPage = ConvertUtil.convertPage(userPage, UserVo.class);
        return R.success(userVoPage);
    }

    /**
     * 获取个人信息
     *
     * @param id 用户ID
     * @return 用户信息
     * @author hgl
     */
    @Operation(summary = "查询用户详情", tags = "用户管理模块")
    @GetMapping("/user/info/{id}")
    public R<UserInfoVo> getUserInfo(@PathVariable Long id) {
        // 非空校验
        AssertUtil.notNull(id, ErrorCode.REQUEST_PARAM_ERROR);
        // 查询用户
        UserEntity user = userService.getById(id);
        String url = cosManager.getAccessSignature(user.getAvatar(), BusinessConstant.ONE_DAY);
        user.setAvatar(url);
        // 数据脱敏
        UserInfoVo userVo = ConvertUtil.convertObject(user, UserInfoVo.class, null);
        return R.success(userVo);
    }

    /**
     * 更新个人信息
     *
     * @param userDto 用户信息
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "更新用户信息", tags = "用户管理模块")
    @PostMapping("/user/update")
    public R<String> updateUserInfo(@RequestBody UserUpdateDto userDto) {
        // 非空校验
        AssertUtil.notNull(userDto, ErrorCode.REQUEST_PARAM_ERROR);
        // 转换为实体
        UserEntity user = ConvertUtil.convertObject(userDto, UserEntity.class, null);
        // 更新用户
        UpdateWrapper<UserEntity> wrapper = new UpdateWrapper<UserEntity>()
                .eq("id", user.getId());
        if (user.getUsername() != null && !user.getUsername().isEmpty())
            wrapper.set("username", user.getUsername());
        if (user.getPassword() != null && !user.getPassword().isEmpty()) {
            String encrypted = StrUtil.encryptByMd5(user.getPassword());
            wrapper.set("password", encrypted);
        }
        if (user.getEmail() != null && !user.getEmail().isEmpty())
            wrapper.set("email", user.getEmail());
        if (user.getPhone() != null && !user.getPhone().isEmpty())
            wrapper.set("phone", user.getPhone());
        if (user.getRoleId() != null) wrapper.set("role_id", user.getRoleId());
        if (user.getStatus() != null) wrapper.set("status", user.getStatus());
        boolean updated = userService.update(wrapper);
        AssertUtil.isTrue(updated, ErrorCode.UPDATE_FALSE);
        return R.ok("更新成功");
    }

    /**
     * 保存用户信息
     *
     * @param userDto 用户信息
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "保存用户信息", tags = "用户管理模块")
    @PutMapping("/user/save")
    public R<String> saveUserInfo(@RequestBody UserSaveDto userDto) {
        // 非空校验
        AssertUtil.notNull(userDto, ErrorCode.REQUEST_PARAM_ERROR);
        // 转换为实体
        UserEntity user = ConvertUtil.convertObject(userDto, UserEntity.class, null);
        // 保存用户
        String encrypted = StrUtil.encryptByMd5(BusinessConstant.DEFAULT_PASSWORD);
        user.setPassword(encrypted);
        user.setAvatar(BusinessConstant.DEFAULT_AVATAR);
        user.setRegisterTime(new Date());
        boolean saved = userService.save(user);
        AssertUtil.isTrue(saved, ErrorCode.SAVE_FALSE);
        return R.ok("保存成功");
    }

    /**
     * 删除用户信息
     *
     * @param id 用户ID
     * @return R<String>
     * @author hgl
     */
    @Operation(summary = "删除用户信息", tags = "用户管理模块")
    @DeleteMapping("/user/remove/{id}")
    public R<String> removeUserInfo(@PathVariable Long id) {
        // 非空校验
        AssertUtil.notNull(id, ErrorCode.REQUEST_PARAM_ERROR);
        // 删除用户
        boolean removed = userService.removeById(id);
        AssertUtil.isTrue(removed, ErrorCode.REMOVE_FALSE);
        return R.ok("删除成功");
    }
}
